home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / SWAPOUT.ASM < prev    next >
Assembly Source File  |  1989-07-16  |  44KB  |  1,087 lines

  1. ; SWAP - (c) Copyright 1988 Nico Mak and Mansfield Software Group
  2. ; All rights reserved
  3. ;
  4. ; To rebuild SWAP.COM use the following instructions:
  5. ;   masm swap;
  6. ;   link swap;
  7. ;   exe2bin swap swap.com
  8. ;
  9. cr              equ     13
  10. lf              equ     10
  11.  
  12. error   macro   message                 ;; macro to display an error message
  13.         local   around, msg, msglen     ;; and to jump to error_exit routine
  14.         jmp     around
  15. msg     db      &message,cr,lf          ;; define error message
  16. msglen  equ     $-msg
  17. around:
  18.         mov     dx,offset msg           ;; get address of error message
  19.         mov     cx,msglen               ;; get length
  20.         jmp     error_exit              ;; jump to error exit routine
  21.         endm
  22.  
  23. ; -------------------------------------------------------------------
  24. ; the following is copied over the swappee
  25. ; -------------------------------------------------------------------
  26. code    segment 'code'
  27.         assume  cs:code,ds:code
  28.         org     100h                    ; org past psp
  29. swap    proc    near
  30.         jmp     begin
  31.                 db      20 dup('STACK')
  32. stack           equ     $
  33.  
  34. flag            db      0       ; option flag
  35. flag_copy       equ     80h     ; copy stdout to 'con'
  36. flag_force      equ     40h     ; swap even if vector points to swappee
  37. flag_quiet      equ     20h     ; don't print hello message
  38. flag_disk       equ     10h     ; swap to disk
  39.  
  40. emsg_ems        db      "SWAP EMS Error "
  41. ems_rc          db      'xx function '
  42. ems_func        db      'xx',cr,lf
  43. emsg_ems_len    equ     $-emsg_ems
  44.  
  45. my_psp          dw      ?       ; segment of SWAP's original psp
  46. swappee_psp     dw      ?       ; segment of swappee's psp
  47.  
  48. ; variables used when swapping to expanded memory
  49. ems_handle      dw      ?       ; emm handle
  50. swap_pages      dw      ?       ; number of pages for ems_handle
  51. ems_frame       dw      ?       ; ems page frame
  52. last_ems_func   db      ?       ; last emm function issued by swap
  53.  
  54. ; variables used when swapping to disk
  55. swap_fid        db      "c:\swap.dat",0 ; asciiz string to open swap file
  56. swap_handle     dw      ?       ; handle while swap file is open
  57.  
  58. ; fields for int 21 function 4b (exec)
  59. commandcom_addr dd      ?       ; address of program to exec (command.com)
  60. exec_sp         dw      ?       ; save area for reg clobbered by exec function
  61. command_line    db      ?,"/c"          ; command line for command.com
  62. command_text    db      130 dup (0)     ; command line continued
  63. blank_fcb       db      36 dup (0)      ; dummy fcb for exec function
  64. exec_parm_block equ     $               ; exec parameter block
  65. exec_env        dw      ?               ; segment addr of environment
  66. cmdline_addr    dw      offset command_line     ; address of command line
  67. cmdline_seg     dw      ?
  68.                 dw      offset blank_fcb        ; address of fcb
  69. fcb1_seg        dw      ?
  70.                 dw      offset blank_fcb        ; address of fcb
  71. fcb2_seg        dw      ?
  72.  
  73. ; fields used by int 21 handler
  74. save_pid        dw      ?       ; pid at time int 21 handler received control
  75. int21_vector    dd      ?       ; original int 21 vector owner
  76. con             db      "con",0 ; asciiz string to open console
  77. handle          dw      ?       ; handle while "con" is open
  78. char_buf        db      ?       ; buffer for int 21 function 2 and 6 handlers
  79. save_ax         dw      ?       ; register save areas for int 21 handler
  80. save_bx         dw      ?
  81. save_cx         dw      ?
  82. save_dx         dw      ?
  83. save_ds         dw      ?
  84.  
  85. ; -------------------------------------------------------------------
  86. ; run_command - the following code is copied over the swappee
  87. ; -------------------------------------------------------------------
  88. run_command:
  89.         call    copy_start              ; start copying stdout to the console
  90.         call    exec_user_cmd           ; execute the user's command
  91.         call    copy_stop               ; stop copying stdout to the console
  92.         call    swap_in                 ; swap in all but first 16k
  93.         retf
  94.  
  95. ; -------------------------------------------------------------------
  96. ; subroutines for run_command follow
  97. ; -------------------------------------------------------------------
  98.  
  99. ; -----
  100. ; copy_start - if -c option specified, open handle for console and hook int 21
  101. ; -----
  102. copy_start:
  103.         test    flag,flag_copy          ; will we copy stdout to display?
  104.         jz      copy_start_ret          ; no
  105. ; ----- open a handle that points to "con"
  106.         mov     dx,offset con           ; address of asciiz file name
  107.         mov     ax,3d01h                ; code to open handle for writing
  108.         int     21h                     ; open the file
  109.         mov     handle,ax               ; remember handle
  110.         jnc     open_worked             ; did open succeed?
  111.         and     flag,255-flag_copy      ; no, then we won't copy stdout ...
  112.         jmp     short copy_start_ret    ; ... and won't hook int 21
  113. open_worked:
  114. ; ----- hook int 21 vector
  115.         mov     ax,3521h                ; code to get interrupt 21 vector
  116.         int     21h                     ; ask dos for address in vector
  117.         mov     word ptr int21_vector,bx; save offset
  118.         mov     word ptr int21_vector[2],es ; save segment
  119.         mov     dx,offset int21_handler ; address of our int 21 handler
  120.         mov     ax,2521h                ; code to set interrupt 21 address
  121.         int     21h                     ; tell dos to set int 21 vector
  122. ; ----- ensure that standard error is redirected and copied
  123.         mov     al,cs:[19h]             ; get stdout file handle array entry
  124.         mov     cs:[1ah],al             ; use stdout entry for stderr entry
  125. copy_start_ret:
  126.         ret
  127.  
  128. ; -----
  129. ; exec_user_cmd - set up and issue the int 21 function 4b (exec)
  130. ; -----
  131. exec_user_cmd:
  132.         mov     cs:exec_sp,sp           ; save register
  133.         mov     ax,cs:[2ch]             ; pass address of our environment
  134.         mov     exec_env,ax             ; to exec function
  135.         mov     word ptr cmdline_seg,ds ; address of command line
  136.         mov     word ptr fcb1_seg,ds    ; fill in segments for fcbs
  137.         mov     word ptr fcb2_seg,ds
  138.         push    cs
  139.         pop     es
  140.         mov     bx,offset exec_parm_block       ; bx = exec parameter block
  141.         lds     dx,commandcom_addr      ; es:bx = asciiz string of command.com
  142.         mov     ax,4b00h                ; code to load and execute a program
  143.         int     21h                     ; tell dos to execute the user's program
  144.         mov     ds,cs:swappee_psp       ; restore ds addressability
  145.         cli                             ; turn off interrupts
  146.         mov     ss,swappee_psp          ; restore stack
  147.         mov     sp,exec_sp
  148.         sti                             ; allow interrupts
  149.         ret
  150.  
  151. ; -----
  152. ; copy_stop - close handle and restore original int 21 vector
  153. ; -----
  154. copy_stop:
  155.         test    cs:flag,flag_copy       ; did we copy stdout to display?
  156.         jz      copy_stop_ret           ; no
  157. ; ----- close handle for console
  158.         mov     bx,handle               ; close handle for 'con'
  159.         mov     ah,3eh                  ; dos function = close handle
  160.         int     21h                     ; tell dos to close 'con'
  161. ; ----- restore original int 21 vector
  162.         push    ds                      ; ds gets clobbered, so save it
  163.         lds     dx,int21_vector         ; get address of old int 21 vector
  164.         mov     ax,2521h                ; code to set interrupt 21 address
  165.         int     21h                     ; tell dos to change it
  166.         pop     ds                      ; restore ds addressability
  167. copy_stop_ret:
  168.         ret
  169.  
  170. ; -----
  171. ; swap_in - swap in all but the first page of swappee
  172. ; -----
  173. swap_in:
  174.         mov     bx,cs                   ; bx = swappee's psp
  175.         add     bx,3ffh                 ; first page to swap in over
  176.         mov     es,bx
  177.         test    flag,flag_disk
  178.         jnz     swap_in_disk
  179. ; ----- swap in from expanded memory
  180.         mov     c